<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>行排序</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="queries-union.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="queries.html">快退</a></td><td width="60%" align="center" valign="bottom">章7. 查询</td><td width="10%" align="right" valign="top"><a href="queries.html">快进</a></td><td width="10%" align="right" valign="top"><a href="queries-limit.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="QUERIES-ORDER">7.5. 行排序</a></h1><a name="AEN3542"></a><a name="AEN3544"></a>
<p>在查询生成输出表之后，也就是在处理完选择列表之后，你还可以对输出表进行排序。如果没有排序，那么行将以不可预测的顺序返回(实际顺序将取决于扫描和连接规划类型和在磁盘上的顺序，但是肯定不能依赖这些东西)。确定的顺序只能在明确地使用了排序步骤之后才能保证。</p>
<p><tt class="LITERAL">ORDER BY</tt> 子句用于声明排序顺序</p>
<pre class="SYNOPSIS">SELECT <tt class="REPLACEABLE"><i>select_list</i></tt>
    FROM <tt class="REPLACEABLE"><i>table_expression</i></tt>
    ORDER BY <tt class="REPLACEABLE"><i>sort_expression1</i></tt> [<span class="OPTIONAL">ASC | DESC</span>] [<span class="OPTIONAL">, <tt class="REPLACEABLE"><i>sort_expression2</i></tt> [<span class="OPTIONAL">ASC | DESC</span>] ...</span>]</pre>
<p><tt class="REPLACEABLE"><i>sort_expression</i></tt> 是任何可用于选择列表的表达式，例如：</p>
<pre class="PROGRAMLISTING">SELECT a, b FROM table1 ORDER BY a + b, c;</pre>
<p>如果指定了多个排序表达式，那么仅在前面的表达式排序相等的情况下才使用后面的表达式做进一步排序。每个表达式都可以跟一个可选的 <tt class="LITERAL">ASC</tt>(升序，默认) 或 <tt class="LITERAL">DESC</tt>(降序)以设置排序方向。升序先输出小的数值，这里的"小"是以 <tt class="LITERAL">&lt;</tt> 操作符的角度定义的。类似的是，降序是以 <tt class="LITERAL">&gt;</tt> 操作符来判断的。<a name="AEN3564" href="queries-order.html#FTN.AEN3564"><span class="footnote">[1]</span></a></p>
<p>为了向后兼容 SQL92 标准，<tt class="REPLACEABLE"><i>sort_expression</i></tt> 也可以使用字段名或者字段编号，比如下面两句</p>
<pre class="PROGRAMLISTING">SELECT a + b AS sum, c FROM table1 ORDER BY sum;
SELECT a, max(b) FROM table1 GROUP BY a ORDER BY 1;</pre>
<p>都按照第一个字段进行排序。需要注意的是，输出字段名必须是独立的(不允许作为排序表达式的一部分)。比如，下面的语句是<span class="emphasis"><i class="EMPHASIS">错误</i></span>的。</p>
<pre class="PROGRAMLISTING">SELECT a + b AS sum, c FROM table1 ORDER BY sum + c;          -- 错误的</pre>
<p>这样的限制主要是为了避免歧义。另外，如果某个排序表达式能够同时匹配输出字段名和表表达式中的字段名，也会导致歧义(此时使用输出字段名)。当然，这种情况仅在你使用了 <tt class="LITERAL">AS</tt> 重命名输出字段并且恰好与其它表的字段同名的时候才会发生。</p>
<p><tt class="LITERAL">ORDER BY</tt> 可以应用于 <tt class="LITERAL">UNION</tt>, <tt class="LITERAL">INTERSECT</tt>, <tt class="LITERAL">EXCEPT</tt> 的计算结果，不过在这种情况下，只允许按照字段的名字或编号进行排序，而不允许按照表达式进行排序。</p>
</div>
<h3 class="FOOTNOTES">注意</h3>
<table border="0" class="FOOTNOTES" width="100%">
<tr><td align="LEFT" valign="TOP" width="5%"><a name="FTN.AEN3564" href="queries-order.html#AEN3564"><span class="footnote">[1]</span></a></td><td align="LEFT" valign="TOP" width="95%"><p>事实上，PostgreSQL 使用<i class="FIRSTTERM">默认的B-tree操作符类</i> 为表达式的数据类型确定 <tt class="LITERAL">ASC</tt> 和 <tt class="LITERAL">DESC</tt>排序顺序。一般来说，数据类型将被转换为适合于 <tt class="LITERAL">&lt;</tt> 和 <tt class="LITERAL">&gt;</tt> 操作符进行排序。但是对于用户自定义的数据类型可以不必如此。</p></td></tr>
</table>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="queries-union.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="queries-limit.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">组合查询</td><td width="34%" align="center" valign="top"><a href="queries.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top"><tt class="LITERAL">LIMIT</tt> 和 <tt class="LITERAL">OFFSET</tt></td></tr>
</table>
</div>
</body></html>